package world.xuewei.controller;

import lombok.extern.slf4j.Slf4j;
import world.xuewei.component.utils.JwtUtil;
import world.xuewei.model.entity.R;
import world.xuewei.model.entity.UserBase;
import world.xuewei.service.UserBaseService;
import org.springframework.web.bind.annotation.*;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

/**
 * 用户基础表(UserBase)表控制层
 *
 * @author makejava
 * @since 2024-11-15 19:27:51
 */
@RestController
@RequestMapping("/user")
@Slf4j
public class UserBaseController {
    /**
     * 服务对象
     */
    @Resource
    private UserBaseService userBaseService;

    @Resource
    private HttpSession session;

    @PostMapping("/login")
    public R login(@RequestBody UserBase user) {
        try {
            // 参数校验
            if (user == null) {
                return R.error().message("参数不能为空");
            }

            // 检查登录方式：用户名、邮箱、手机号至少有一个
            if (!StringUtils.hasText(user.getUsername())
                    && !StringUtils.hasText(user.getEmail())
                    && !StringUtils.hasText(user.getPhone())) {
                return R.error().message("请输入用户名/邮箱/手机号");
            }


            UserBase userInfo = userBaseService.login(user);

            // 生成token
            String token = JwtUtil.generateToken(userInfo);

            // 返回token和用户基本信息
            return R.ok()
                    .data("token", token)
                    .data("userId", userInfo.getId())
                    .data("username", userInfo.getUsername())
                    .data("role", userInfo.getRoles())
                    .message("登录成功");
        } catch (Exception e) {
            return R.error().message(e.getMessage());
        }
    }

    // 注册
    @PostMapping("/register")
    public R register(@RequestBody UserBase user) {
        try {
            // 参数校验
            if (user == null) {
                return R.error().message("参数不能为空");
            }
            // 参数校验
            if (!StringUtils.hasText(user.getUsername()) || !StringUtils.hasText(user.getPassword())) {
                return R.error().message("用户名和密码不能为空");
            }
            // 验证用户名格式（如果使用用户名登录）
            if (StringUtils.hasText(user.getUsername())) {
                if (user.getUsername().length() > 30) {
                    return R.error().message("用户名长度不能超过30个字符");
                }
                // 检查特殊字符
                if (!user.getUsername().matches("^[a-zA-Z0-9_\\u4e00-\\u9fa5]+$")) {
                    return R.error().message("用户名不能包含特殊字符");
                }
            }

            // 判断密码
            if (!StringUtils.hasText(user.getPassword())) {
                return R.error().message("密码不能为空");
            }

            // 验证密码格式
            String passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>/?]).{8,20}$";
            if (!user.getPassword().matches(passwordRegex)) {
                return R.error().message("密码必须包含大小写字母、数字和特殊字符，长度为8-20位");
            }

            boolean success = userBaseService.register(user);

            return success ?
                    R.ok().message("注册成功") :
                    R.error().message("注册失败");
        } catch (Exception e) {
            return R.error().message(e.getMessage());
        }
    }


    //    商户注册
    @PostMapping("/merchant_register")
    public R merchantRegister(@RequestBody UserBase user) {
        try {
            // 参数校验
            if (user == null) {
                return R.error().message("参数不能为空");
            }
            if (!StringUtils.hasText(user.getUsername()) || !StringUtils.hasText(user.getPassword())) {
                return R.error().message("用户名和密码不能为空");
            }

            // 验证用户名格式（如果使用用户名登录）
            if (StringUtils.hasText(user.getUsername())) {
                if (user.getUsername().length() > 30) {
                    return R.error().message("用户名长度不能超过30个字符");
                }
                // 检查特殊字符
                if (!user.getUsername().matches("^[a-zA-Z0-9_\\u4e00-\\u9fa5]+$")) {
                    return R.error().message("用户名不能包含特殊字符");
                }
            }

            // 判断密码
            if (!StringUtils.hasText(user.getPassword())) {
                return R.error().message("密码不能为空");
            }

            // 验证密码格式
            String passwordRegex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>/?]).{8,20}$";
            if (!user.getPassword().matches(passwordRegex)) {
                return R.error().message("密码必须包含大小写字母、数字和特殊字符，长度为8-20位");
            }

            // 调用商户注册服务
            boolean success = userBaseService.registerMerchant(user);

            return success ?
                    R.ok().message("商户注册成功") :
                    R.error().message("商户注册失败");
        } catch (Exception e) {
            return R.error().message(e.getMessage());
        }
    }

    // 退出登入
    @PostMapping("/logout")
    public R logout(HttpSession session) {
        try {
            return R.ok().message("退出成功");
        } catch (Exception e) {
            return R.error().message("退出失败：" + e.getMessage());
        }
    }

    //编辑用户信息
    @PostMapping("/edit")
    public R edit(@RequestBody UserBase user) {
        try {
            if (user.getId().toString().isEmpty()) {
                return R.error().message("用户ID不能为空");
            }
            userBaseService.edit(user);
            return R.ok();
        } catch (Exception e) {
            return R.error().message(e.getMessage());
        }
    }


}

